﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.jsim
    求n维极值的单形调优法
    f(double [],int)计算目标函数值的函数名。
    int jsim(int n, double x[], double eps, double xx[], double (*f)(double [],int))
    参数 n: 变量个数。
    参数 x: x[n+1]前n个分量返回极小值点的n个坐标；最后一个分量返回极小值。
    参数 eps: 控制精度要求。
    参数 xx: xx[n+1][n+1]前n行返回最后单形的n+1个顶点坐标；最后一行返回最后单形的n+1个顶点的目标函数值。
    返回值 函数返回迭代次数。本函数最多迭代500次。
    */

    public static unsafe string drive_jsim()
    {
        int i;
        double eps;
        double[] x = new double[3];
        double[,] xx = new double[3, 3];

        eps = 1.0e-30;
        gl.f_xa_n = jsimf;
        i = gl.jsim(2, x, eps, xx);

        string rs = "";
        rs += gl.html_table("顶点坐标与目标函数值(迭代次数=" + i + ")", xx);
        rs += gl.html_table("极小值点坐标与极小值", x);
        return rs;
    }

    // 计算目标函数值
    private static unsafe double jsimf(double* x, int n)
    {
        double y;
        //n = n;
        y = x[1] - x[0] * x[0];
        y = 100.0 * y * y;
        y = y + (1.0 - x[0]) * (1.0 - x[0]);
        return (y);
    }
}